FastAPI তে Pydantic Model ব্যবহার করে ডাটা ভ্যালিডেশন এবং টাইপ চেকিং খুবই সহজ এবং শক্তিশালী। Pydantic একটি Python লাইব্রেরি যা ডাটা যাচাই (validation) এবং টাইপ এনোটেশনকে সহজ করে তোলে। FastAPI Pydantic মডেল ব্যবহার করে ইনপুট ডাটার টাইপ যাচাই এবং ভ্যালিডেশন কার্যকরভাবে সম্পন্ন করে।
এখানে আমরা দেখব কিভাবে Pydantic Model তৈরি এবং ভ্যালিডেশন করতে হয়, এবং কিভাবে FastAPI-তে এই মডেল ব্যবহার করা যায়।
Step 1: Pydantic Model তৈরি করা
Pydantic মডেল তৈরি করতে BaseModel ক্লাসকে ইনহেরিট করতে হয়। এর মধ্যে আপনি ডাটা টাইপ এবং বিভিন্ন ভ্যালিডেশন রুলস নির্ধারণ করতে পারেন।
Pydantic Model উদাহরণ
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
এখানে:
name: একটি স্ট্রিং (string) টাইপ ফিল্ড, যা বাধ্যতামূলক।description: একটি ঐচ্ছিক স্ট্রিং (string) টাইপ ফিল্ড।price: একটি ফ্লোট (float) টাইপ ফিল্ড, যা বাধ্যতামূলক।tax: একটি ঐচ্ছিক ফ্লোট (float) টাইপ ফিল্ড।
Step 2: FastAPI-তে Pydantic Model ব্যবহার করা
এখন FastAPI-তে Pydantic মডেলটি ব্যবহার করে একটি API এন্ডপয়েন্ট তৈরি করা হবে, যা একটি POST রিকোয়েস্ট গ্রহণ করবে।
উদাহরণ: Pydantic Model ব্যবহার করে FastAPI এন্ডপয়েন্ট
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# Pydantic Model
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price, "item_tax": item.tax}
এখানে, /items/ এন্ডপয়েন্ট একটি POST রিকোয়েস্ট গ্রহণ করবে এবং Item মডেলটি Request Body হিসেবে গ্রহণ করবে।
রিকোয়েস্ট উদাহরণ (JSON Body):
POST /items/
Body:
{
"name": "Laptop",
"description": "A high-performance laptop",
"price": 1500.00,
"tax": 120.00
}
রেসপন্স:
{
"item_name": "Laptop",
"item_price": 1500.00,
"item_tax": 120.00
}
এখানে, Request Body JSON আকারে পাঠানো হয়েছে এবং FastAPI এই ডাটা Item মডেল দিয়ে স্বয়ংক্রিয়ভাবে ভ্যালিডেট করেছে।
Step 3: Pydantic Model-এ Validation (ভ্যালিডেশন)
Pydantic মডেল ব্যবহার করে FastAPI-তে ইনপুট ডাটা ভ্যালিডেশন করা যায়। আপনি Field কনস্ট্রেইন্ট (constraints) ব্যবহার করে ইনপুট ডাটার সীমাবদ্ধতা নির্ধারণ করতে পারেন, যেমন min_length, max_length, gt, lt, regex ইত্যাদি।
উদাহরণ: Validation কনস্ট্রেইন্ট সহ Pydantic Model
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str = Field(..., min_length=3) # নামের কমপক্ষে ৩টি অক্ষর থাকতে হবে
description: str | None = Field(None, max_length=300) # বর্ণনা সর্বোচ্চ ৩০০টি অক্ষর
price: float = Field(..., gt=0) # দাম শূন্যের বেশি হতে হবে
tax: float | None = None
এখানে:
name: কমপক্ষে ৩টি অক্ষর থাকতে হবে।description: সর্বাধিক ৩০০টি অক্ষর থাকতে হবে।price: ০ এর বেশি হওয়া উচিত।
রিকোয়েস্ট উদাহরণ:
{
"name": "Laptop",
"description": "A high-end laptop",
"price": 1500.00
}
রেসপন্স:
{
"item_name": "Laptop",
"item_price": 1500.00
}
ভুল ইনপুট উদাহরণ (যেমন: price <= 0):
{
"name": "Laptop",
"description": "A high-end laptop",
"price": -10.00
}
রেসপন্স (ত্রুটি):
{
"detail": [
{
"loc": ["body", "price"],
"msg": "ensure this value is greater than 0",
"type": "value_error.number.gt"
}
]
}
এখানে, price ফিল্ডে -10.00 মানটি ভুল কারণ এটি ০ এর কম, এবং FastAPI সেই অনুযায়ী ত্রুটি দেখাবে।
Step 4: Default Values এবং Optional Fields
Pydantic মডেলে আপনি Optional Fields এবং Default Values নির্ধারণ করতে পারেন।
উদাহরণ: Optional Fields এবং Default Values
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = "No description provided" # Default value
price: float
tax: float | None = 0.0 # Default value
এখানে:
description: ঐচ্ছিক ফিল্ড এবং এর ডিফল্ট মান"No description provided"।tax: ঐচ্ছিক ফিল্ড এবং এর ডিফল্ট মান0.0।
রিকোয়েস্ট উদাহরণ:
{
"name": "Laptop",
"price": 1500.00
}
রেসপন্স:
{
"item_name": "Laptop",
"item_price": 1500.00,
"item_tax": 0.0,
"description": "No description provided"
}
এখানে, description ফিল্ডের ডিফল্ট মান "No description provided" ব্যবহার করা হয়েছে কারণ এটি পাঠানো হয়নি।
Step 5: Nested Models (নেস্টেড মডেল)
FastAPI তে Pydantic মডেল ব্যবহার করে আপনি nested models তৈরি করতে পারেন, যা জটিল ডাটা স্ট্রাকচারকে সমর্থন করে।
উদাহরণ: Nested Models
from pydantic import BaseModel
from typing import List
class Manufacturer(BaseModel):
name: str
country: str
class Item(BaseModel):
name: str
price: float
manufacturer: Manufacturer # Nested Model
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price, "manufacturer": item.manufacturer}
এখানে, Item মডেলের মধ্যে Manufacturer মডেলকে nested হিসেবে অন্তর্ভুক্ত করা হয়েছে।
রিকোয়েস্ট উদাহরণ:
{
"name": "Laptop",
"price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
}
রেসপন্স:
{
"item_name": "Laptop",
"item_price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
}
এখানে, manufacturer একটি nested model হিসেবে Item মডেলে অন্তর্ভুক্ত করা হয়েছে।
FastAPI-তে Pydantic Model ব্যবহার করে Request Body তৈরি এবং ভ্যালিডেশন করা খুবই সহজ এবং কার্যকর। আপনি Pydantic মডেলের মাধ্যমে ইনপুট ডাটা টাইপ, ভ্যালিডেশন কনস্ট্রেইন্ট এবং ডিফল্ট মান খুব সহজে নির্ধারণ করতে পারেন। এছাড়া, আপনি নেস্টেড মডেল ব্যবহার করে জটিল ডাটা স্ট্রাকচারও তৈরি করতে পারেন, যা আপনার API-এর কার্যক্ষমতা এবং নিরাপত্তা বাড়ায়।
Read more